#ifndef RAPIDJSON_FILESTREAM_H_
#define RAPIDJSON_FILESTREAM_H_

#include <cstdio>

namespace rapidjson {

//! Wrapper of C file stream for input or output.
/*!
    This simple wrapper does not check the validity of the stream.
    \implements Stream
*/
class FileStream {
public:
    typedef char Ch;    //!< Character type. Only support char.

    FileStream(FILE* fp) : fp_(fp), count_(0) { Read(); }
    char Peek() const { return current_; }
    char Take() { char c = current_; Read(); return c; }
    size_t Tell() const { return count_; }
    void Put(char c) { fputc(c, fp_); }

    // Not implemented
    char* PutBegin() { return 0; }
    size_t PutEnd(char*) { return 0; }

private:
    void Read() {
        RAPIDJSON_ASSERT(fp_ != 0);
        int c = fgetc(fp_);
        if (c != EOF) {
            current_ = (char)c;
            count_++;
        }
        else
            current_ = '\0';
    }

    FILE* fp_;
    char current_;
    size_t count_;
};

} // namespace rapidjson

#endif // RAPIDJSON_FILESTREAM_H_
